package designPattern.DecoratorPattern;

import designPattern.DecoratorPattern.Decorator.RedShapeDecorator;
import designPattern.DecoratorPattern.Decorator.ShapeDecorator;
import designPattern.DecoratorPattern.Shape.Impl.Circle;
import designPattern.DecoratorPattern.Shape.Impl.Rectangle;
import designPattern.DecoratorPattern.Shape.Shape;

/**
 * fileName: DecoratorPatternDemo
 * description: 装饰者模式
 * <p>
 * 装饰器模式（Decorator Pattern）允许向一个现有的对象添加新的功能，同时又不改变其结构。
 * 这种类型的设计模式属于结构型模式，它是作为现有的类的一个包装。
 * <p>
 * 这种模式创建了一个装饰类，用来包装原有的类，并在保持类方法签名完整性的前提下，提供了额外的功能。
 * <p>
 * 使用场景：
 * 1、扩展一个类的功能。
 * 2、动态增加功能，动态撤销。
 *
 * @author lihaogn-main
 * @version 1.0
 * @date 2019/9/12 14:49
 */
public class DecoratorPatternDemo {

    public static void main(String[] args) {
        Shape circle = new Circle();

        ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
        ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());

        System.out.println("最初的圆形");
        circle.draw();
        System.out.println("给圆形加个边框");
        redCircle.draw();

        System.out.println();

        System.out.println("最初的矩形");
        redRectangle.draw();
        System.out.println("给矩形加个边框");
        redRectangle.draw();
    }
}
